﻿using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 读取有合并单元格的表格
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 打开 Excel 文件
            using (FileStream file = new FileStream("F:\\Study\\朝夕教育视频课程\\wpflesson\\读取有合并单元格的表格\\20241017(1).xlsx", FileMode.Open, FileAccess.Read))
            {
                IWorkbook workbook = new XSSFWorkbook(file); // 对于 .xlsx 文件
                                                             // IWorkbook workbook = new HSSFWorkbook(file); // 对于 .xls 文件
                ISheet sheet = workbook.GetSheetAt(1); // 获取第一个工作表

                // 获取合并单元格的数量
                int numMergedRegions = sheet.NumMergedRegions;

                // 遍历所有行
                for (int row = 0; row <= sheet.LastRowNum; row++)
                {
                    IRow currentRow = sheet.GetRow(row);
                    if (currentRow != null)
                    {
                        // 遍历所有列
                        for (int col = 0; col < currentRow.LastCellNum; col++)
                        {
                            ICell cell = currentRow.GetCell(col);

                            // 检查当前单元格是否在合并单元格中
                            for (int i = 0; i < numMergedRegions; i++)
                            {
                                CellRangeAddress range = sheet.GetMergedRegion(i);
                                if (range.IsInRange(row, col))
                                {
                                    // 如果在合并单元格中，获取合并区域的第一个单元格的值
                                    ICell mergedCell = sheet.GetRow(range.FirstRow).GetCell(range.FirstColumn);
                                    Console.Write($"{mergedCell.ToString()}\t");
                                    break;
                                }
                            }

                            // 如果不是合并单元格，直接输出单元格的值
                            if (cell != null && !cell.IsMergedCell)
                            {
                                Console.Write($"{cell.ToString()}\t");
                            }
                        }
                        Console.WriteLine();
                    }
                }
            }

            Console.ReadKey();
        }
    }
}
